package com.xbdun.web.bmp.util;

import org.apache.commons.lang.math.NumberUtils;

import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.fastjson.JSON;
import com.xbdun.common.qr.LoginMacResponse;
import com.xbdun.common.util.EncryptUtil;
import com.xbdun.common.util.MacUtil;
import com.xbdun.facade.bmp.exceptions.BmpBizException;
import com.xbdun.facade.bmp.request.system.PlatformRequest;
import com.xbdun.facade.bmp.response.system.PlatformResponse;
import com.xbdun.facade.bmp.service.system.PlatfromFacade;
import com.xbdun.facade.validatebmp.response.WxUnionCallPcResponse;

public class LoginSkipUtil {
	/**
	* @Title: chekedLoginQr
	* @Description: 通过二维码扫码登录后，获取到Redis值进行路演验证
	* @param ipAddr	当前IP地址
	* @param data	签名可以解签的密钥字符串
	* @throws Exception    设定文件
	* @return boolean    返回类型
	 */
	public final static WxUnionCallPcResponse chekedLoginQr(String ipAddr,String data)throws Exception{
		String decrypt = null;
		try{
			if(StringUtils.isBlank(data))throw BmpBizException.LOGIN_QR_MAC_FAIL;
			decrypt = EncryptUtil.decrypt(data);
		}catch(Exception e){
			throw BmpBizException.LOGIN_QR_MAC_FAIL;
		}
		if(StringUtils.isEmpty(decrypt))throw BmpBizException.LOGIN_QR_MAC_FAIL;
		
		WxUnionCallPcResponse parseObject = JSON.parseObject(decrypt, WxUnionCallPcResponse.class);
		if(!MacUtil.validateMac(parseObject)){
			throw BmpBizException.LOGIN_QR_MAC_FAIL;
		}
		//判断用户扫码的IP是否一致，不一致那么就不允许继续操作登录
		if(StringUtils.isNotEmpty(ipAddr)&&!ipAddr.endsWith(parseObject.getIpAddr())){
			throw BmpBizException.LOGIN_QR_MAC_FAIL.newInstance("您不在同一的IP上进行操作，请重新再试");
		}
		return parseObject;
	}
	/**
	* @Title: chekedLoginQr
	* @Description: 通过二维码扫码登录后，获取到Redis值进行路演验证
	* @param ipAddr	当前IP地址
	* @param data	签名可以解签的密钥字符串
	* @param secretkey	签名KEY
	* @param secretVal	签名的密钥
	* @throws Exception    设定文件
	* @return boolean    返回类型
	 */
	public final static LoginMacResponse chekedRealyLoginQr(String ipAddr,String data,PlatfromFacade platfromFacadel)throws Exception{
		String decrypt = null;
		try{
			if(StringUtils.isBlank(data))throw BmpBizException.LOGIN_QR_MAC_FAIL;
			decrypt = EncryptUtil.decrypt(data);
		}catch(Exception e){
			throw BmpBizException.LOGIN_QR_MAC_FAIL;
		}
		if(StringUtils.isEmpty(decrypt))throw BmpBizException.LOGIN_QR_MAC_FAIL;
		//响应对象
		LoginMacResponse parseObject = JSON.parseObject(decrypt, LoginMacResponse.class);
		if(!NumberUtils.isDigits(parseObject.getSecretKey())){
			throw BmpBizException.LOGIN_QR_MAC_FAIL.newInstance("密钥KEY系统未定义");
		}
		//用户编号
		if(null ==  parseObject.getUserCode() ||parseObject.getUserCode().longValue()<=0){
			throw BmpBizException.DEF_ERROR.newInstance("对不起您跨业务流程访问失败;");
		}
		//机构编号
		if(null ==  parseObject.getOrgCode() ||parseObject.getOrgCode().longValue()<=0){
			throw BmpBizException.DEF_ERROR.newInstance("对不起，机构编号不能为空;");
		}
		//远程查询密钥,这里需要做缓存
		PlatformRequest request = new PlatformRequest();
		request.setPlatCode(Integer.valueOf(parseObject.getSecretKey()));
		platfromFacadel.getSecretVal(request);
		PlatformResponse secretVal = platfromFacadel.getSecretVal(request);
		request = null;
		if(null == secretVal||StringUtils.isBlank(secretVal.getSecretVal())){
			throw BmpBizException.LOGIN_QR_MAC_FAIL.newInstance("平台KEY并没有找寻到对应密钥存在");
		}
		
		//判断用户扫码的IP是否一致，不一致那么就不允许继续操作登录
		/*if(StringUtils.isNotEmpty(ipAddr)&&!ipAddr.endsWith(parseObject.getQrIp())){
			throw BmpBizException.LOGIN_QR_MAC_FAIL.newInstance("您不在同一的IP上进行操作，请重新再试");
		}*/
		//远程通用校验密钥
		if(!MacUtil.validateMac(parseObject,parseObject.getSecretKey(), secretVal.getSecretVal())){
			throw BmpBizException.LOGIN_QR_MAC_FAIL;
		}
		
		return parseObject;
	}
}
